Row polymorphism
PureScriptのRecordで使える
OCamlにもあるらしい
構造的部分型にも似ている
{ a :: A | r }と書けば、
{ a :: A}は許容する
{ a :: A, b :: B }も許容する
{ b :: B, c :: C}は許容しない
日本語でなぜ列多相と呼ぶのか
http://msakai.jp/d/20070704.html
Row Types
Roy polymorphismとstructural subtypingの違い
https://cs.stackexchange.com/questions/53998/what-are-the-major-differences-between-row-polymorphism-and-subtyping
https://brianmckenna.org/blog/row_polymorphism_isnt_subtyping
擬似コードをgpt-4.iconに書かせて理解しようと思ったけど、これ疑似TypeScriptじゃだめだなmrsekut.icon
実行時に型情報を見て挙動が変わるようなものを想定しないと理解がおかしくなる
参考
https://en.wikipedia.org/wiki/Row_polymorphism
https://hgiasac.github.io/posts/2018-11-18-Record-Row-Type-and-Row-Polymorphism.html
https://kmizu.hatenablog.com/entry/2017/07/31/155629
http://osiire.hatenablog.com/entry/20081129
https://github.com/purescript/documentation/blob/master/language/Types.md#row-polymorphism
forall r. { foo :: Int, bar :: Int | r } -> IntのrがRow型
https://github.com/ghc-proposals/ghc-proposals/pull/180
hsに入れるproposal